package com.syf.controller;

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import com.syf.model.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 完成文件上传的功能：
 *      /image/AliYunImgUpload
 */
@Slf4j
@RestController
@Api(tags = "文件上传的控制器")
public class FileController {


    @Autowired
    private OSS ossClient;  // spring-cloud-alibaba-oss 会自动的注入该对象，报红不要紧

    @Value("${spring.cloud.alicloud.access-key}")
    private String accessId;   //AccessKey ID

    @Value("${oss.bucket.name:syf-imgs}")
    private String bucketName; //Bucket名称

    @Value("${spring.cloud.alicloud.oss.endpoint}")
    private String endPoint; //地域名称

    //1.需要使用内网穿透： http://syf.free.idcfengye.com(公网地址)  -> 127.0.0.1:9000 -> 执行回调函数【203: 上传成功，没回调-显示不了】
    //2.将回调函数jar包上传到服务器: 120.24.169.153:9000
    @Value("${oss.callback.url:120.24.169.153:9000}")
    private String ossCallbackUrl; //上传文件成功后，OSS服务器想回调的callbackUrl(公网) 发一个post请求来告诉后端服务器用户上传文件的情况

    @ApiOperation(value = "上传文件")
    @PostMapping("/image/AliYunImgUpload")
    @CrossOrigin
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "你要上传的文件")
    })
    public R<String> fileUpload(@RequestParam("file") MultipartFile file) throws IOException { //返回: 能使用浏览器访问到文件路径
        log.info("准备上传文件---------------------");

        //文件的名称:  2020-10-10 -> 2020/10/10/xxx.jpg
        String fileName = DateUtil.today().replaceAll("-", "/") + "/" + file.getOriginalFilename();
        //上传文件: (bucketName、文件的名称: 日期 +原始的文件名(或者uuid)来做、文件的输入流)
        ossClient.putObject(bucketName, fileName, file.getInputStream());
        //https://coin-exchange-imgs.oss-cn-beijing.aliyuncs.com/2020/10/10/xxx.jpg
        return R.ok("https://" + bucketName + "." + endPoint + "/" + fileName); //能使用浏览器访问到文件路径http://xxx.com/路径
    }


}
